function xq() {
    return new Promise((resolve, reject) => { //return一个promise对象，这个属于同步操作，不需要等待，函数调用后0秒就能完成
        //resolve表示成功状态函数，只要调用了，就表示接下来要执行then方法
        //reject表示失败状态函数，只要调用了，就表示接下来要执行catch方法
        setTimeout(() => {
            console.log('胡总相亲成功');
            resolve()  // 成功状态表示接下来执行then方法
        }, 1000)
    })
}

function marry() {
    return new Promise((resolve, reject) => {//return一个promise对象，这个属于同步操作，不需要等待，函数调用后0秒就能完成
        setTimeout(() => {
            console.log('胡总结婚了');
            resolve()
        }, 2000)
    })
}

function baby() {
    setTimeout(() => {
        console.log('小胡出生');
    }, 500)
}

// 1. 执行 xq 函数，立即返回一个promise 实例对象，但是此时该对象的状态是 pending （等待状态）因为不确定对象内的回调函数的执行状态
// 2. .then立即触发，但是 then 里面的回调函数没有触发
// 3. 等待 xq 函数里面的reslove()执行完毕，此时实例对象的状态会变更为 fulfilled （成功状态），此时 .then 里面的回调函数会触发执行

xq()  // 里面执行到了 reslove()
    .then(() => {
        // then的源码里面默认也返回了一个 promise 实例对象，状态默认继承自 xq 函数返回的对象的状态
        //xq函数返回的对象内的回调函数变成成功或失败状态后，则表示该then创建的对象的状态也变成了成功或失败状态
        //这样就使得下一个then和本then同步触发
        // (通俗点讲就是，如果本then内不加return，那么默认后续的then内的回调函数的触发与本then一样，都是等xq函数返回的对象内的函数执行完毕再执行)
        return marry()
        //return的作用就是返回marry函数返回的promise对象内的回调函数的执行完毕后的状态(reslove或者reject)
    })
    .then(() => {
        baby()
        //baby的执行取决于上一个then有无返回值，如果没有，则看上个then所继承的函数(xq函数)返回的状态
        //有返回值就看上一个then返回的对象内的回调函数的执行状态
    })



// xq()
// .then(() => {
//   marry().then(() => {
//     baby()
//   })
// })



